/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.*;
import suministros.ejb30.TO.DetalleOrdenTO;
import suministros.ejb30.entity.DetalleMovimiento;
import suministros.ejb30.entity.Movimiento;
import suministros.ejb30.entity.Orden;
import suministros.ejb30.entity.Parametros;
import suministros.ejb30.entity.Pedido;
import suministros.ejb30.TO.SubAlmacenTO;
import suministros.ejb30.entity.Almacen;
import suministros.ejb30.entity.ComprobantePago;
import suministros.ejb30.entity.DetalleInventario;
import suministros.ejb30.entity.DetalleInventarioPK;
import suministros.ejb30.entity.DetalleMovimientoPK;
import suministros.ejb30.entity.DetalleMovimientoTemporal;
import suministros.ejb30.entity.DetalleOrden;
import suministros.ejb30.entity.DetalleOrdenPK;
import suministros.ejb30.entity.DetallePedidoSuministro;
import suministros.ejb30.entity.DetallePedidoSuministroPK;
import suministros.ejb30.entity.DetalleTransferencia;
import suministros.ejb30.entity.DetalleTransferenciaPK;
import suministros.ejb30.entity.Empresa;
import suministros.ejb30.entity.GrupoSuministros;
import suministros.ejb30.entity.Inventario;
import suministros.ejb30.entity.Localidad;
import suministros.ejb30.entity.NecesidadesSumi;
import suministros.ejb30.entity.NecesidadesSumiDetalle;
import suministros.ejb30.entity.NecesidadesSumiDetallePK;
import suministros.ejb30.entity.Proyecto;
import suministros.ejb30.entity.StockAlmacen;
import suministros.ejb30.entity.StockAlmacenPK;
import suministros.ejb30.entity.Suministros;
import suministros.ejb30.entity.Tipo;
import suministros.ejb30.entity.Transferencia;
import suministros.ejb30.entity.Zona;
import suministros.ejb30.entity.DetalleMovimientoTemporal;
import suministros.ejb30.entity.SubAlmacen;
import suministros.ejb30.helper.Utiles_Convertir;
import suministros.ejb30.helper.Utiles_Fecha;

/**
 *
 * @author CAROLINA
 */
@Stateless
public class SumiGestionMovimientoBean implements SumiGestionMovimientoLocal {
 @EJB
 private SumiGestionPedidoDAOLocal sumiGestionPedidoDAO;

 @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;

 EntityManager em;

  @Resource(name="jdbc/Administracion")
  DataSource dsAdministracion;

  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }//
  public List<AlmacenTO> getListaAlmacenes() throws Exception
  {
    Query consulta = this.em.createNativeQuery("SELECT id_almacen, descripcion,id_zona FROM almacen");
    return Utiles_Convertir.convertirTOAlmacen_AlmacenTO(consulta.getResultList());
  }
//
  public List<SubAlmacenTO> getListaSubAlmacenes() throws Exception
  {

    Query consulta = this.em.createNativeQuery("SELECT id_subalmacen, descripcion,idAlmacen  FROM subalmacen");
    return Utiles_Convertir.convertirTOAlmacen_subAlmacenTO(consulta.getResultList());
  }
//
  public String getId(Movimiento mov) throws Exception
  {
    Utiles_Fecha fecha = new Utiles_Fecha(mov.getFecha());

    String retorno = null;
    Connection cnx = null;
    try {
     
      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoMovimiento](?,?,?,?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setInt(2, mov.getTipoMovimiento().getIdTablaTipo());
      csLlamada.setString(3, mov.getIdZona().getIdZona());
      csLlamada.setString(4, fecha.getAnio());
      csLlamada.setString(5, mov.getEmpresa().getIdEmpresa());
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
  public String getIdTrans(Transferencia trans) throws Exception
  {
    Utiles_Fecha fecha = new Utiles_Fecha(trans.getFecha());
    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoTransferencia](?,?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setString(2, fecha.getAnio());
      csLlamada.setString(3, trans.getEmpresa().getIdEmpresa());
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      throw ex;
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
  public DetalleOrdenTO obtenerDetalleOrden(String codigo, int cor){
        DetalleOrdenTO or= new DetalleOrdenTO();
        Query consulta = this.em.createNativeQuery(" Select nro_orden,correlativo,ID_Suministro,cantidad,precio_unitario," +
                "id_cod_presupuestal,id_cod_inversion,id_cuenta_contable_inversion,Cod_CentroCosto,Cod_Pedido,id_zona," +
                "id_localidad,cantidadIngresada,id_proyecto,cod_Uni_Organizativa  from DetalleOrden " +
                "where nro_orden='"+codigo+"' and correlativo='"+cor+"'");
        or= (DetalleOrdenTO)Utiles_Convertir.convertirDetalleOrden_ordenTO(consulta.getResultList()).get(0);

        return or;
  }
  //
 public String insertarNotaIngreso(String usuario, String mac,Movimiento mov, List<DetalleMovimiento> detalleMovimiento, int codigoTemporal,int tiper) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getId(mov);
    BigDecimal sumatotal= BigDecimal.ZERO;
    boolean estadoOrden=true;
    tx.begin();
    try {
  
      if(tiper==1){
          Orden orde=this.obtenerOrden(mov.getNroOrden().getNroOrden());
          mov.setNroOrden(orde);
          mov.setIdMovimiento(codigo);
          mov.setUsuario(usuario);
          mov.setMac(mac);
          mov.setFechaOperacion(new Date());
          Empresa emp=em.find(Empresa.class, mov.getEmpresa().getIdEmpresa());
          mov.setEmpresa(emp);
          this.em.persist(mov);
          
          for (DetalleMovimiento detalle : detalleMovimiento)
          {

             DetalleOrden det= new DetalleOrden();
             DetalleOrdenPK detaopk=new DetalleOrdenPK( detalle.getDetalleMovimientoPK().getIdMovimiento(), detalle.getDetalleMovimientoPK().getNrodetalleMovimiento());
             det=this.em.find(DetalleOrden.class,detaopk);

            DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(), mov.getIdMovimiento());
            detalle.setDetalleMovimientoPK(detapk);
            detalle.setCcosto(det.getCodCentroCosto());
            detalle.setCodInv(det.getIdCodInversion());
            detalle.setCodPresupuestal(det.getIdCodPresupuestal());
            Suministros s= this.obtenerSuministro(det.getIDSuministro());
            detalle.setIdSuministro(s);
            detalle.setIdZona(this.obtenerZona(det.getIdZona()));
            detalle.setId_unidad_organica(det.getId_unidad_organica());
            detalle.setIdProyecto(det.getIdproyecto());
            detalle.setEstado_ubicacion(new Integer(0));
            detalle.setValor(new BigDecimal(Float.parseFloat(detalle.getCantidad()+"")*Float.parseFloat(detalle.getPrecio()+"")));
            sumatotal=sumatotal.add(detalle.getValor());
            det.setCantidadIngresada(new BigDecimal(Double.parseDouble(det.getCantidadIngresada()+"")+Double.parseDouble(detalle.getCantidad()+"")));
               if(det.getCantidad().compareTo(det.getCantidadIngresada())==0){
                   estado=false;
                 }
                if(det.getCantidad().compareTo(det.getCantidadIngresada())>0){
                   estado=true;
                }
                if(det.getCantidad().compareTo(det.getCantidadIngresada())<0){
                   estadoOrden=false;
                 }

             if(detalle.getIdProyecto()==null){
                GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
                detalle.setCta_cble(det.getCta_cble());
                detalle.setCta_cble_alm(g.getCuenta_almacen());

            }
            if(detalle.getCantidad().compareTo(BigDecimal.ZERO)>0){
                 this.em.persist(detalle);
                 this.em.merge(det);
            }
          }

          //para comprobante
          Long id_comprobante= Long.parseLong(mov.getAlmacenOrigen()+"");
          System.out.println("--"+mov.getAlmacenOrigen());
          ComprobantePago com= this.em.find(ComprobantePago.class,id_comprobante );
          //com.setMonto_ingresado(com.getMonto_ingresado().add(sumatotal.multiply(new BigDecimal(mov.getNroDevolucion()))));//multiplicar por el impuesto
          com.setMonto_ingresado(com.getMonto_ingresado().add(new BigDecimal(mov.getNroDevolucion())));//multiplicar por el impuesto

          em.merge(com);

          if(estadoOrden){
              Tipo tipo;
              if(estado){
              tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "PA"));
              }
              else{
              tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "TA"));
              }
              Orden or= em.find(Orden.class, mov.getNroOrden().getNroOrden());
              or.setEstadoAtencion(tipo);

              em.merge(or);
              this.em.flush();
              tx.commit();
          }
          else{
              tx.rollback();
              throw new Exception("La orden de compra ya fue atendida totalmente");
          }
          //terminaaaaa

          
      }
      if(tiper==2){
          mov.setIdMovimiento(codigo);
          mov.setUsuario(usuario);
          mov.setMac(mac);
          mov.setFechaOperacion(new Date());
          mov.setEmpresa(em.find(Empresa.class, mov.getEmpresa().getIdEmpresa()));
          this.em.persist(mov);
          for (DetalleMovimiento detalle : detalleMovimiento)
          {
            DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(),codigo);
            detalle.setDetalleMovimientoPK(detapk);
            if(detalle.getIdProyecto()==null){
                    Suministros s= this.obtenerSuministro(detalle.getIdSuministro().getIDSuministro());
                    GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
                    /*Tipo tipo_grupob= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "B"));
                    Tipo tipo_grupos= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "S"));
                    Tipo tipo_grupoa= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "A"));
                     if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupob.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_compra());
                     }
                    if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupos.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_servicio());
                     }
                    if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupoa.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_materiales());
                     }*/
                    //TODO DE AHORA EN ADELANTE TODOS SERAN BIENES
                    detalle.setCta_cble(g.getCuenta_compra());
                    detalle.setCta_cble_alm(g.getCuenta_almacen());

                }
            this.em.persist(detalle);

          }
          if(codigoTemporal>=0){
              DetalleMovimientoTemporal temporal= this.em.find(DetalleMovimientoTemporal.class, codigoTemporal);
              this.em.remove(this.em.merge(temporal));
          }
          this.em.flush();
          tx.commit();
      }
      if(tiper==3){
          Transferencia trans=em.find(Transferencia.class, mov.getIdTransferencia().getIdTransferencia());
          trans.setEstado(new Integer(2));
          em.merge(trans);
          mov.setNumero(trans.getNroDocumento());
          mov.setUsuario(usuario);
          mov.setMac(mac);
          mov.setFechaOperacion(new Date());
          mov.setEmpresa(em.find(Empresa.class, mov.getEmpresa().getIdEmpresa()));
          mov.setIdTransferencia(trans);
          mov.setIdMovimiento(codigo);
          this.em.persist(mov);
          for (DetalleMovimiento detalle : detalleMovimiento)
          {
            DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(),codigo);
            detalle.setDetalleMovimientoPK(detapk);
            if(detalle.getIdProyecto()==null){
                    Suministros s= this.obtenerSuministro(detalle.getIdSuministro().getIDSuministro());
                    GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
                    /*Tipo tipo_grupob= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "B"));
                    Tipo tipo_grupos= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "S"));
                    Tipo tipo_grupoa= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "A"));
                     if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupob.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_compra());
                     }
                    if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupos.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_servicio());
                     }
                    if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupoa.getIdTablaTipo().intValue()){
                        detalle.setCta_cble(g.getCuenta_materiales());
                     }*/
                    //TODO: DE AHORA EN ADELANTE TODOS SON CONSIDERADOS BIENES
                    detalle.setCta_cble(g.getCuenta_compra());
                    detalle.setCta_cble_alm(g.getCuenta_almacen());

                }
            this.em.persist(detalle);
          }
          this.em.flush();
          tx.commit();
      }
      
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}
 public String insertarIngresoCarga(Movimiento mov, DetalleMovimiento detalle, int tipo) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getId(mov);
    tx.begin();
    try {
         if(tipo==1){
          mov.setIdMovimiento(codigo);
          mov.setFechaOperacion(new Date());
          Empresa emp=em.find(Empresa.class, mov.getEmpresa().getIdEmpresa());
          mov.setEmpresa(emp);
          this.em.persist(mov);

          DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(), mov.getIdMovimiento());
          detalle.setDetalleMovimientoPK(detapk);
          Suministros s= this.obtenerSuministro(detalle.getIdSuministro().getIDSuministro());
          detalle.setIdSuministro(s);
          detalle.setIdZona(this.obtenerZona(detalle.getIdZona().getIdZona()));
          detalle.setEstado_ubicacion(new Integer(0));
          GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
          detalle.setCta_cble(g.getCuenta_compra());
          detalle.setCta_cble_alm(g.getCuenta_almacen());
          this.em.persist(detalle);

          this.em.flush();
          tx.commit();
         }

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}
  public String procedimientoModificar(DetalleMovimiento mov) throws Exception
  {
    String retorno = null;
    Connection cnx = null;
    try {
     
      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{call [dbo].[sp_sumi_modificarMovimiento](?,?,?,?,?,?)}");
      csLlamada.setString(1, mov.getDetalleMovimientoPK().getIdMovimiento());
      csLlamada.setInt(2, mov.getDetalleMovimientoPK().getNrodetalleMovimiento());
      csLlamada.setString(3, mov.getIdSuministro().getIDSuministro());
      csLlamada.setBigDecimal(4, mov.getCantidad());
      csLlamada.setBigDecimal(5, mov.getPrecio());
      csLlamada.setBigDecimal(6, mov.getPrecioCosechador());
      csLlamada.execute();
      
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
   public String procedimientoAjustar(String codigo, String anio, String mes) throws Exception
  {
    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{call [dbo].[sp_sumi_ajustarMovimiento](?,?,?)}");
      csLlamada.setString(1, codigo);
      csLlamada.setString(2, anio);
      csLlamada.setString(3, mes);
      csLlamada.execute();

    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
     public String procedimientoTodos(String anio, String mes) throws Exception
  {
    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{call [dbo].[sp_sumi_procesarPrecio](?,?)}");
      csLlamada.setString(1, anio);
      csLlamada.setString(2, mes);
      csLlamada.execute();

    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
   public void ajustarIngresoTodos(List<DetalleMovimiento> detalleMovimiento) throws Exception
  {

    for (DetalleMovimiento detalle : detalleMovimiento) {
            DetalleMovimiento deta= this.em.find(DetalleMovimiento.class,detalle.getDetalleMovimientoPK());
            String codigo=deta.getIdSuministro().getIDSuministro();
            String anio= deta.getMovimiento().getAnio();
            String mes=deta.getMovimiento().getMes();
            procedimientoAjustar(codigo, anio, mes);
    }

 }
    public void ajustarIngresoSuministro(String codigo, String ano, String mes) throws Exception
  {
       procedimientoAjustar(codigo, ano, mes);
  }
     public void ajustarIngreso( String ano, String mes) throws Exception
  {
       procedimientoTodos( ano, mes);
  }
     public void ajustarIngresoCarga(List<DetalleMovimiento> detalleMovimiento) throws Exception
  {

    for (DetalleMovimiento detalle : detalleMovimiento) {
            DetalleMovimiento deta= this.em.find(DetalleMovimiento.class,detalle.getDetalleMovimientoPK());
            String codigo=deta.getIdSuministro().getIDSuministro();
            Movimiento m= this.em.find(Movimiento.class, detalle.getDetalleMovimientoPK().getIdMovimiento());
            String anio= m.getAnio();
            String mes=m.getMes();
           procedimientoAjustar(codigo, anio, mes);
    }

}
  public String procedimientoEliminar(DetalleMovimiento mov) throws Exception
  {
    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{call [dbo].[sp_sumi_eliminarMovimiento](?,?,?)}");
      csLlamada.setString(1, mov.getDetalleMovimientoPK().getIdMovimiento());
      csLlamada.setInt(2, mov.getDetalleMovimientoPK().getNrodetalleMovimiento());
      csLlamada.setString(3, mov.getIdSuministro().getIDSuministro());
      csLlamada.execute();

    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
 public void modificarIngresoCarga(List<DetalleMovimiento> detalleMovimiento) throws Exception
  {
     for (DetalleMovimiento detalle : detalleMovimiento) {
        DetalleMovimiento deta= this.em.find(DetalleMovimiento.class,detalle.getDetalleMovimientoPK());
        deta.setCantidad(detalle.getCantidad());
        deta.setPrecio(detalle.getPrecio());
        deta.setPrecioCosechador(detalle.getPrecioCosechador());
        procedimientoModificar(deta);
     }
}
 public void eliminarIngresoCarga(List<DetalleMovimiento> detalleMovimiento) throws Exception
  {
   
    for (DetalleMovimiento detalle : detalleMovimiento) {
            DetalleMovimiento deta= this.em.find(DetalleMovimiento.class,detalle.getDetalleMovimientoPK());
            procedimientoEliminar(deta);
    }


}
 public boolean insertarNotaIngresoFicticio(List<DetalleMovimientoTemporal> detalleMovimiento) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      for(DetalleMovimientoTemporal detalle : detalleMovimiento)
      {
          this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
      estado=true;
    }
    catch (Exception e) {
    tx.rollback();
    e.printStackTrace();
    }
    return estado;

}
 public OrdenTO getDatosOrden(String codigo) throws Exception {
    OrdenTO or= new OrdenTO();
    Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "AN"));
    Tipo tipo1 = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "TA"));
    Query consulta = this.em.createNativeQuery("Select o.nro_orden,z.nom_zona,a.descripcion,sa.descripcion, id_empresa, o.tipo_moneda " +
            "from Orden o inner join  almacen a on o.id_almacen= a.id_almacen inner join subAlmacen sa" +
            " on o.id_ubicacion= sa.id_SubAlmacen inner join zona z on a.id_zona= z.id_zona where " +
            "o.nro_orden ='"+codigo+"'  and estado_atencion not in ('"+tipo.getIdTablaTipo()+"','"+tipo1.getIdTablaTipo()+"')");
    List lista=consulta.getResultList();
    if(lista.size()>0){
        or= (OrdenTO)Utiles_Convertir.convertirToBeanBinding_Orden(lista).get(0);
    }
    else{
        or=null;
    }
    return or;

 }//
 public List<DetalleOrdenTO> getDatosDetalleOrdenSumados(String codigo) throws Exception {
        List<DetalleOrdenTO> lista= new ArrayList<DetalleOrdenTO>();
        List<DetalleOrdenTO> lista2= new ArrayList<DetalleOrdenTO>();
         Query consulta = this.em.createNativeQuery("select o.nro_orden, o.ID_Suministro, " +
                 "s.descripcion,  t.descripcion_valor, sum(o.cantidad) as cantidad," +
                 " o.precio_unitario, " +
                 " o.precio_unitario*sum(o.cantidad) as valor, " +
                 "sum(cantidadIngresada) as cantidadIngresada from DetalleOrden o inner " +
                 "join Suministros s  on o.ID_Suministro=s.ID_Suministro inner join tipo t " +
                 "on s.tipo_unidad_medida= t.id_tabla_tipo inner join orden ord on" +
                 " o.nro_orden=ord.nro_orden group by o.ID_Suministro, s.descripcion," +
                 " t.descripcion_valor,  o.precio_unitario, o.nro_orden"+
                 " having o.nro_orden='"+codigo+"'  ");
         lista=Utiles_Convertir.convertirDetalleOrden(consulta.getResultList());
         for(int i=0; i<lista.size(); i++){
             if(!lista.get(i).getCantidadIngresada().equals(lista.get(i).getCantidad())){
                 lista.get(i).setCantidad(new BigDecimal(Double.parseDouble(lista.get(i).getCantidad()+"")-Double.parseDouble(lista.get(i).getCantidadIngresada()+"")));
                 lista2.add(lista.get(i));

             }
         }

        return lista2;
     }//
     public List<DetalleMovimientoTemporalTO> getListaMovimientoTemporal(String ubicacion, String empresa, String ruc) throws Exception {
        List<DetalleMovimientoTemporalTO> lista= new ArrayList<DetalleMovimientoTemporalTO>();
         Query consulta = this.em.createNativeQuery("select dt.id_suministro,s.descripcion, t.descripcion_valor, " +
                 "dt.cantidad, dt.precio, dt.fecha,dt.serie, dt.numero, dt.ruc, p.razon_social, dt.codigo  from " +
                 "detallemovimientotemporal dt inner join suministros s on dt.id_suministro=s.id_suministro  " +
                 "inner join tipo t on s.tipo_unidad_medida=t.id_tabla_tipo inner join proveedor p on" +
                 " dt.ruc=p.cod_proveedor where dt.id_subalmacen='"+ubicacion+"' and dt.empresa='"+empresa+"' and dt.ruc='"+ruc+"'");
         lista=Utiles_Convertir.convertirDetalleMovimientoTemporal(consulta.getResultList());
        return lista;
     }//
     public List<DetalleOrdenTO> getDatosDetalleOrden(String codigo) throws Exception {
        List<DetalleOrdenTO> lista= new ArrayList<DetalleOrdenTO>();
        List<DetalleOrdenTO> lista2= new ArrayList<DetalleOrdenTO>();
      /*  Query consulta = this.em.createNativeQuery("select o.nro_orden, o.correlativo, o.ID_Suministro, s.descripcion," +
                " t.descripcion_valor,  o.cantidad," +
                " case" +
                " when ord.tipo_moneda=95 then o.precio_unitario*(select tipo_Cambio from tipo_cambio_diario  where fecha=(select " +
                " top 1 fecha_ingreso from comprobantepago cp inner join orden_comprobante oc " +
                " on cp.id_comprobante=oc.id_comprobante where oc.nro_orden='"+codigo+"'))" +
                " when ord.tipo_moneda=94 then o.precio_unitario" +
                " end as precio_unitario," +
                " case " +
                " when ord.tipo_moneda=95 then o.cantidad*precio_unitario*(select tipo_Cambio from tipo_cambio_diario  where fecha=(select " +
                " top 1 fecha_ingreso from comprobantepago cp inner join orden_comprobante oc " +
                " on cp.id_comprobante=oc.id_comprobante where oc.nro_orden='"+codigo+"')) " +
                " when ord.tipo_moneda=94 then o.cantidad*precio_unitario " +
                " end as valor, o.cantidadIngresada from DetalleOrden" +
                " o inner join Suministros s on o.ID_Suministro=s.ID_Suministro inner join tipo t on s.tipo_unidad_medida= t.id_tabla_tipo" +
                " inner join orden ord on ord.nro_orden=o.nro_orden " +
                " where ord.nro_orden='"+codigo+"'");
*/
        Query consulta = this.em.createNativeQuery("select o.nro_orden, o.correlativo, o.ID_Suministro, s.descripcion," +
                " t.descripcion_valor,  o.cantidad, o.precio_unitario,  o.cantidad*precio_unitario, o.cantidadIngresada from DetalleOrden" +
                " o inner join Suministros s on o.ID_Suministro=s.ID_Suministro inner join tipo t on s.tipo_unidad_medida= t.id_tabla_tipo" +
                " inner join orden ord on ord.nro_orden=o.nro_orden " +
                " where ord.nro_orden='"+codigo+"'");
       lista= Utiles_Convertir.convertirDetalleOrdenGeneral(consulta.getResultList());
         for(int i=0; i<lista.size(); i++){
             if(!lista.get(i).getCantidadIngresada().equals(lista.get(i).getCantidad())){
                 lista.get(i).setCantidad(new BigDecimal(Double.parseDouble(lista.get(i).getCantidad()+"")-Double.parseDouble(lista.get(i).getCantidadIngresada()+"")));
                 lista2.add(lista.get(i));
                 
             }
         }
        return lista2;
     }

      public List<DetalleIngresoTO> getDatosDetalleIngresoUbicacionSumados(String codigo) throws Exception {
        Query consulta = this.em.createNativeQuery("select o.id_Movimiento,  o.ID_Suministro, s.descripcion, " +
                "t.descripcion_valor, sum(o.cantidad), o.precio, fecha from DetalleMovimiento o" +
                " inner join Suministros s on o.ID_Suministro=s.ID_Suministro inner join tipo t " +
                "on s.tipo_unidad_medida= t.id_tabla_tipo group by o.ID_Suministro, s.descripcion," +
                " t.descripcion_valor, precio, fecha, id_movimiento,estado_ubicacion  having o.id_Movimiento='"+codigo+"' and estado_ubicacion=0");
        List<DetalleIngresoTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_detalleIngresoTO(consulta.getResultList());
        return lista2;
     }

       public List<DetalleIngresoTO> getDatosDetalleIngresoUbicacionSumados2(String codigo) throws Exception {
        Query consulta = this.em.createNativeQuery("select o.id_Movimiento,  o.ID_Suministro, s.descripcion, " +
                "t.descripcion_valor, sum(o.cantidad), o.precio, fecha from DetalleMovimiento o" +
                " inner join Suministros s on o.ID_Suministro=s.ID_Suministro inner join tipo t " +
                "on s.tipo_unidad_medida= t.id_tabla_tipo group by o.ID_Suministro, s.descripcion," +
                " t.descripcion_valor, precio, fecha, id_movimiento,estado_ubicacion  having o.id_Movimiento='"+codigo+"'");
        List<DetalleIngresoTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_detalleIngresoTO(consulta.getResultList());
        return lista2;
     }
     //
      public MovimientoTO obtenerMovimiento(String codigo){
       MovimientoTO or= new MovimientoTO();
        Query consulta = this.em.createNativeQuery("select m.id_movimiento, z.nom_zona, a.descripcion," +
                "sa.descripcion, m.fecha, m.id_empresa from Movimiento m inner join  almacen a on m.id_almacen= a.id_almacen inner join " +
                "subAlmacen sa on m.id_subalmacen= sa.id_SubAlmacen inner join zona z on m.id_zona= z.id_zona " +
                "where m.id_movimiento='"+codigo+"'");
        or= (MovimientoTO)Utiles_Convertir.convertirToBeanBinding_Movimiento(consulta.getResultList()).get(0);

        return or;

      }//
      public Suministros obtenerSuministro(String codigo){
      
       Suministros mov = this.em.find(Suministros.class, codigo);
       return mov;
      }//
      public Zona obtenerZona(String codigo){
        //Query consulta = this.em.createNamedQuery("Zona.findByIdZona");
        //consulta.setParameter("idZona", codigo);
       // Zona mov = (Zona)consulta.getSingleResult();
        //return mov;
          Zona mov = this.em.find(Zona.class, codigo);
          return mov;
      }//
      public Localidad obtenerLocalidad(String codigo){
        /*Query consulta = this.em.createNamedQuery("Localidad.findByIdLocalidad");
        consulta.setParameter("idLocalidad", codigo);
        Localidad mov = (Localidad)consulta.getSingleResult();
        return mov;*/
          Localidad mov= this.em.find(Localidad.class,codigo);
          return mov;
      }//
      public Orden obtenerOrden(String codigo){
        /*Query consulta = this.em.createNamedQuery("Orden.findByNroOrden");
        consulta.setParameter("nroOrden", codigo);
        Orden mov = (Orden)consulta.getSingleResult();
        return mov;*/
        Orden or= this.em.find(Orden.class,codigo);
        return or;
      }//
      
 /* public boolean insertarUbicacion(String usuario, String mac, List<UbicacionSuministro> detalleUbicacion,String mov, String sumi, String inventario, int tipo) throws Exception
  {
    boolean retorno = false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      for (UbicacionSuministro detalle : detalleUbicacion)
      {
        detalle.setUsuario(usuario);
        detalle.setMac(mac);
        detalle.setFechaOperacion(new Date());
        detalle.setEmpresa(em.find(Empresa.class, detalle.getEmpresa().getIdEmpresa()));
        this.em.persist(detalle);
      }
      List<DetalleIngresoTO> lista= getLista(mov, sumi);
      for(DetalleIngresoTO deta: lista) {
      DetalleMovimientoPK detpk= new DetalleMovimientoPK(deta.getNrodetalle(), deta.getNroIngreso());
      DetalleMovimiento detmov=  em.find(DetalleMovimiento.class, detpk);
      detmov.setEstado_ubicacion(new Integer(1));
      em.merge(detmov);
      }

      this.em.flush();
      tx.commit();
      retorno = true;
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return retorno;

}//*/
   public List<DetalleIngresoTO> getLista(String movimiento, String sumi) throws Exception {
        Query consulta=this.em.createNativeQuery("Select nro_detalleMovimiento,id_Movimiento,id_suministro  from DetalleMovimiento where id_Movimiento='"+movimiento+"' and id_suministro='"+sumi+"'");
        return Utiles_Convertir.detalleMov(consulta.getResultList());
    }
//
   public PedidoTO getDatosPedido(String codigo) throws Exception {
    Query consulta = this.em.createNativeQuery("SELECT Pedido.Cod_Pedido, localidad.nom_localidad," +
            "Tipo.descripcion_valor, convert(char(10),Pedido.Fecha_emision,103), " +
            "convert(char(10),Pedido.Fecha_atencion,103), Pedido.Cod_CentroCosto, " +
            "Pedido.id_cod_presupuestal, Pedido.id_cuenta_contable_inversion, " +
            "Pedido.id_cod_inversion, Pedido.Observaciones,Tipo.codigo," +
            "Pedido.id_proyecto,z.nom_zona, Pedido.ano, Pedido.mes, Pedido.id_empresa FROM Pedido INNER JOIN localidad ON " +
            "Pedido.id_localidad = localidad.id_localidad INNER JOIN Tipo ON Pedido.Tipo_Estado_Pedido = " +
            "Tipo.id_tabla_tipo inner join zona z " +
            "on Pedido.id_zona=z.id_zona where Pedido.Cod_Pedido='"+codigo+"'");
    return Utiles_Convertir.convertirToBeanBinding_PedidoIngreso(consulta.getResultList()).get(0);
  }//
    public List<DetalleOrdenTO> getListaDetallePedidoSuministro(String cod_pedido,int tipo_admin, int tipo_ped) throws Exception {

    
         Query consulta = this.em.createNativeQuery("SELECT dps.Cod_Pedido,s.ID_Suministro, s.descripcion," +
                 " dps.cantidad_pedida,t1.descripcion_valor,0 as precio,p.cod_Uni_Organizativa,p.id_cod_presupuestal," +
                 "p.id_cod_inversion,p.id_cuenta_contable_inversion,p.Cod_CentroCosto,p.id_zona,p.id_localidad," +
                 "p.id_proyecto,id_almacen, id_subalmacen FROM Detalle_Pedido_Suministro dps INNER JOIN Suministros s ON dps.ID_Suministro = " +
                 "s.ID_Suministro inner join Tipo t1 ON s.tipo_unidad_medida=t1.id_tabla_tipo inner join Pedido p on " +
                 "dps.Cod_Pedido=p.Cod_Pedido where dps.Cod_Pedido='" + cod_pedido + "'and dps.id_tipo_administrador_tarea='"+tipo_admin+"' and dps.Tipo_Estado_Pedido='"+tipo_ped+"'");

         return Utiles_Convertir.convertirToBeanBinding_DetallePedidoSalida(consulta.getResultList());


    }//
    /* public List<UbicacionTO> getListaUbicacionesAsc(String cod_suministro, String subalmacen, String empresa) throws Exception {
        
         Query consulta = this.em.createNativeQuery("select id_zona, id_almacen, id_subalmacen, id_ambiente, id_pabellon," +
                 " id_estante, id_casilla, id_Movimiento, ID_suministro, cantidad, fechaIngreso, precio, monto " +
                 "from UbicacionSuministro  where cantidad > 0.00 and id_suministro='"+cod_suministro+"' " +
                 "and id_subalmacen='"+subalmacen+"' and id_empresa='"+empresa+"'order by fechaIngreso asc ");
         return Utiles_Convertir.convertirToBeanBinding_Ubicacion(consulta.getResultList());
    }//*/
    /* public List<UbicacionTO> getListaUbicacionesDesc(String cod_suministro, String subalmacen,String empresa) throws Exception {
       
         Query consulta = this.em.createNativeQuery("select id_zona, id_almacen, id_subalmacen, id_ambiente, id_pabellon," +
                 " id_estante, id_casilla, id_Movimiento, ID_suministro, cantidad, fechaIngreso, precio, monto " +
                 "from UbicacionSuministro  where cantidad > 0.00 and id_suministro='"+cod_suministro+"' " +
                 "and id_subalmacen='"+subalmacen+"' and id_empresa='"+empresa+"' order by fechaIngreso desc ");
         return Utiles_Convertir.convertirToBeanBinding_Ubicacion(consulta.getResultList());
    }//*/
     /* public List<UbicacionTO> getListaUbicacionesAscNon(String cod_suministro, String subalmacen,String empresa) throws Exception {
        
         Query consulta = this.em.createNativeQuery("select u.id_zona, u.id_almacen, u.id_subalmacen, a.descripcion, p.descripcion,e.descripcion, " +
                 "c.descripcion, u.id_Movimiento, u.ID_suministro, u.cantidad, u.fechaIngreso, u.precio, u.monto, " +
                 "su.descripcion from  UbicacionSuministro u inner join ambiente a on u.id_ambiente= a.id_Ambiente inner " +
                 "join pabellon p on u.id_pabellon = p.id_Pabellon inner join estante e on u.id_estante= e.id_Estante" +
                 " inner join casilla c on u.id_casilla=c.id_Casilla inner join suministros su on u.id_suministro= " +
                 "su.id_suministro where u.cantidad > 0.00 and u.id_suministro='"+cod_suministro+"' " +
                 "and u.id_subalmacen='"+subalmacen+"' and u.id_empresa='"+empresa+"' order by u.fechaIngreso asc");
         return Utiles_Convertir.convertirToBeanBinding_UbicacionNon(consulta.getResultList());
    }//*/
      /*  public List<UbicacionTO> getListaUbicacionesNonEsp(String cod_suministro, String subalmacen,String empresa) throws Exception {

         Query consulta = this.em.createNativeQuery("select  u.ID_suministro, su.descripcion, a.descripcion, p.descripcion,e.descripcion," +
                 " c.descripcion, sum(u.cantidad) from  UbicacionSuministro u inner join ambiente a on u.id_ambiente= a.id_Ambiente " +
                 "inner join pabellon p on u.id_pabellon = p.id_Pabellon inner join estante e on u.id_estante= e.id_Estante inner join" +
                 " casilla c on u.id_casilla=c.id_Casilla inner join suministros su on u.id_suministro= su.id_suministro where u.cantidad > 0.00" +
                 " and u.id_suministro='"+cod_suministro+"'  and u.id_subalmacen='"+subalmacen+"' and u.id_empresa='"+empresa+"' group by u.id_suministro,u.id_casilla,  su.descripcion, " +
                 "a.descripcion, p.descripcion, e.descripcion, c.descripcion order by su.descripcion asc");
         return Utiles_Convertir.convertirToBeanBinding_UbicacionNon2(consulta.getResultList());
    }/*/
     /* public List<UbicacionTO> getListaUbicacionesNonTodos(String subalmacen,String empresa) throws Exception {

         Query consulta = this.em.createNativeQuery("select  u.ID_suministro, su.descripcion, a.descripcion, p.descripcion,e.descripcion," +
                 " c.descripcion, sum(u.cantidad) from  UbicacionSuministro u inner join ambiente a on u.id_ambiente= a.id_Ambiente " +
                 "inner join pabellon p on u.id_pabellon = p.id_Pabellon inner join estante e on u.id_estante= e.id_Estante inner join" +
                 " casilla c on u.id_casilla=c.id_Casilla inner join suministros su on u.id_suministro= su.id_suministro where u.cantidad > 0.00" +
                 " and u.id_subalmacen='"+subalmacen+"' and u.id_empresa='"+empresa+"' group by u.id_suministro,u.id_casilla,  su.descripcion, " +
                 "a.descripcion, p.descripcion, e.descripcion, c.descripcion order by su.descripcion asc");
         return Utiles_Convertir.convertirToBeanBinding_UbicacionNon2(consulta.getResultList());
    }//*/
     /* public List<UbicacionTO> getListaUbicacionesDescNon(String cod_suministro, String subalmacen,String empresa) throws Exception {

         Query consulta = this.em.createNativeQuery("select u.id_zona, u.id_almacen, u.id_subalmacen, a.descripcion, p.descripcion,e.descripcion, " +
                 "c.descripcion, u.id_Movimiento, u.ID_suministro, u.cantidad, u.fechaIngreso, u.precio, u.monto, " +
                 "su.descripcion from  UbicacionSuministro u inner join ambiente a on u.id_ambiente= a.id_Ambiente inner " +
                 "join pabellon p on u.id_pabellon = p.id_Pabellon inner join estante e on u.id_estante= e.id_Estante" +
                 " inner join casilla c on u.id_casilla=c.id_Casilla inner join suministros su on u.id_suministro= " +
                 "su.id_suministro where u.cantidad > 0.00 and u.id_suministro='"+cod_suministro+"' " +
                 "and u.id_subalmacen='"+subalmacen+"' and u.id_empresa='"+empresa+"' order by u.fechaIngreso desc");
         return Utiles_Convertir.convertirToBeanBinding_UbicacionNon(consulta.getResultList());
    }*/
    public String insertarSalida(String usuario, String mac,Movimiento mov, List<DetalleMovimiento> listadetalleOr) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getId(mov);
    int contador=1;
    tx.begin();
    try {
      mov.setUsuario(usuario);
      mov.setMac(mac);
      mov.setEmpresa(em.find(Empresa.class,mov.getEmpresa().getIdEmpresa()));
      mov.setCodPedido(null);
      mov.setIdMovimiento(codigo);
      mov.setFechaOperacion(new Date());
      em.persist(mov);
     /* for (UbicacionTO detalle : detalleUbicacion)
      {

        UbicacionSuministroPK ubi= new UbicacionSuministroPK(Integer.parseInt(detalle.getCasilla()),detalle.getMovimiento(),detalle.getSuministro());
        UbicacionSuministro ubisumi= this.em.find(UbicacionSuministro.class,ubi);
        ubisumi.setCantidad(detalle.getCantidad());
        ubisumi.setMonto(detalle.getMonto());
        this.em.merge(ubisumi);
      }*/
      for (DetalleMovimiento detalleor : listadetalleOr)
      {
        Suministros s= em.find(Suministros.class, detalleor.getIdSuministro().getIDSuministro());
        Localidad l= em.find(Localidad.class, detalleor.getIdLocalidad().getIdLocalidad());
        Tipo t= em.find(Tipo.class, detalleor.getTipoMovimiento().getIdTablaTipo());
        detalleor.setMovimiento(mov);
        DetalleMovimientoPK retornopk= new DetalleMovimientoPK(contador,codigo);
        detalleor.setDetalleMovimientoPK(retornopk);
        detalleor.setIdZona(mov.getIdZona());
        detalleor.setIdLocalidad(l);
        detalleor.setTipoMovimiento(t);
        detalleor.setIdSuministro(s);
        //para las cuentas
            GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
            /*Tipo tipo_grupob= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "B"));
            Tipo tipo_grupos= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "S"));
            Tipo tipo_grupoa= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "A"));

            if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupob.getIdTablaTipo().intValue()){
                detalleor.setCta_cble(g.getCuenta_compra());
             }
            if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupos.getIdTablaTipo().intValue()){
                detalleor.setCta_cble(g.getCuenta_servicio());
             }
            if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupoa.getIdTablaTipo().intValue()){
                detalleor.setCta_cble(g.getCuenta_materiales());
             }*/
            //de ahora en adelante todos seran BIENES ya no activos o servicios
            detalleor.setCta_cble(g.getCuenta_compra());
            detalleor.setCta_cble_alm(g.getCuenta_almacen());
        Tipo moneda= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_moneda", "01"));
        detalleor.setCambio_moneda(BigDecimal.ONE);
        detalleor.setTipo_moneda(moneda.getIdTablaTipo());
        em.persist(detalleor);
        contador++;
      }
      this.em.flush();
      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;
}
   
    
    public String insertarSalidaTrans(String usuario, String mac,Movimiento mov, List<DetalleTransferenciaTO> listadetalle) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getId(mov);
    int contador=1;
    tx.begin();
    try {    
      Transferencia trans=em.find(Transferencia.class, mov.getIdTransferencia().getIdTransferencia());
      trans.setEstado(new Integer(1));
      mov.setUsuario(usuario);
      mov.setMac(mac);
      em.merge(trans);
      mov.setEmpresa(em.find(Empresa.class, trans.getEmpresa().getIdEmpresa()));
      mov.setIdTransferencia(trans);
      mov.setMes(trans.getMes());
      mov.setAnio(trans.getAnio());
      mov.setNumero(trans.getNroDocumento());
      mov.setIdMovimiento(codigo);
      mov.setFechaOperacion(new Date());
      em.persist(mov);
     /* for (UbicacionTO detalle : detalleUbicacion)
      {

        UbicacionSuministroPK ubi= new UbicacionSuministroPK(Integer.parseInt(detalle.getCasilla()),detalle.getMovimiento(),detalle.getSuministro());
        UbicacionSuministro ubisumi= this.em.find(UbicacionSuministro.class,ubi);
        ubisumi.setCantidad(detalle.getCantidad());
        ubisumi.setMonto(detalle.getMonto());
        this.em.merge(ubisumi);
      }*/
      for (DetalleTransferenciaTO detalleor : listadetalle)
      {
        Zona z= em.find(Zona.class, detalleor.getZona());
        Suministros s= em.find(Suministros.class, detalleor.getSuministro());
        Localidad l= em.find(Localidad.class, detalleor.getLocalidad());
        Tipo t= mov.getTipoMovimiento();
        detalleor.setUnidad_organica(detalleor.getUnidad_organica());
        DetalleMovimiento detMov=Utiles_Convertir.convertirToDetalleTransferencia_DetalleMovimiento(codigo,contador,s,z,l,t,detalleor);
        GrupoSuministros g=this.em.find(GrupoSuministros.class, s.getCodGrupoSumi().getCodGrupoSumi());
         /*Tipo tipo_grupob= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "B"));
         Tipo tipo_grupos= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "S"));
         Tipo tipo_grupoa= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_suministro", "A"));
         if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupob.getIdTablaTipo().intValue()){
            detMov.setCta_cble(g.getCuenta_compra());
         }
        if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupos.getIdTablaTipo().intValue()){
            detMov.setCta_cble(g.getCuenta_servicio());
         }
        if(g.getTipoSuministros().getIdTablaTipo().intValue()==tipo_grupoa.getIdTablaTipo().intValue()){
            detMov.setCta_cble(g.getCuenta_materiales());
         }*/
        //TODO: DE AHORA EN ADELANTE TODOS SERAN CONSIDERADOS BIENES
        detMov.setCta_cble(g.getCuenta_compra());
        detMov.setCta_cble_alm(g.getCuenta_almacen());
        Tipo moneda= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_moneda", "01"));
        detMov.setCambio_moneda(BigDecimal.ONE);
        detMov.setTipo_moneda(moneda.getIdTablaTipo());
        em.persist(detMov);
        contador++;
      }

      this.em.flush();
      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;



}
 public Movimiento obtenerIngreso(String codigo){
        Query consulta = this.em.createNamedQuery("Movimiento.findByIdMovimiento");
        consulta.setParameter("idMovimiento", codigo);
        Movimiento mov = (Movimiento)consulta.getSingleResult();
        return mov;
      }
//
public String  insertarTransferencia(String usuario, String mac,List<DetalleTransferencia> detalleTranferencia, Transferencia transfe) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getIdTrans(transfe);
    transfe.setIdTransferencia(codigo);
    transfe.setUsuario(usuario);
    transfe.setMac(mac);
    transfe.setFechaOperacion(new Date());
    transfe.setEmpresa(em.find(Empresa.class, transfe.getEmpresa().getIdEmpresa()));
    tx.begin();
    try {
      this.em.persist(transfe);
      for (DetalleTransferencia detalle : detalleTranferencia)
      {
        DetalleTransferenciaPK detpk= new DetalleTransferenciaPK(detalle.getDetalleTransferenciaPK().getIddetalleTransferencia(), codigo);
        detalle.setDetalleTransferenciaPK(detpk);
        Suministros sumi=this.em.find(Suministros.class, detalle.getIdSuministro().getIDSuministro());
        detalle.setIdSuministro(sumi);
        this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}//
 public TransferenciaTO getDatosTransferencia(String codigo, int tipo) throws Exception {
        TransferenciaTO tra= new TransferenciaTO();
        Query consulta=null;
        if(tipo==1){
              consulta = this.em.createNativeQuery("select t.idTransferencia,z.nom_zona,a.descripcion," +
                "sa.descripcion, id_empresa from Transferencia t inner join almacen a on t.AlmacenOrigen= " +
                "a.id_almacen inner join subAlmacen sa on t.SubAlmacenOrigen= sa.id_SubAlmacen" +
                " inner join zona z on t.ZonaOrigen= z.id_zona where " +
                "t.idTransferencia ='"+codigo+"' and t.estado='0'");      
        }
        if(tipo==2){
              consulta = this.em.createNativeQuery("select t.idTransferencia,z.nom_zona,a.descripcion," +
                "sa.descripcion,id_empresa from Transferencia t inner join almacen a on t.AlmacenDestino= " +
                "a.id_almacen inner join subAlmacen sa on t.SubAlmacenDestino= sa.id_SubAlmacen" +
                " inner join zona z on t.ZonaDestino= z.id_zona where " +
                "t.idTransferencia ='"+codigo+"' and t.estado='1'");      
        }
        if(tipo==3){
              consulta = this.em.createNativeQuery("select t.idTransferencia,z.nom_zona,a.descripcion," +
                "sa.descripcion,id_empresa from Transferencia t inner join almacen a on t.AlmacenOrigen= " +
                "a.id_almacen inner join subAlmacen sa on t.SubAlmacenOrigen= sa.id_SubAlmacen" +
                " inner join zona z on t.ZonaOrigen= z.id_zona where " +
                "t.idTransferencia ='"+codigo+"'");
        }
        if(tipo==4){
              consulta = this.em.createNativeQuery("select t.idTransferencia,z.nom_zona,a.descripcion," +
                "sa.descripcion,id_empresa from Transferencia t inner join almacen a on t.AlmacenDestino= " +
                "a.id_almacen inner join subAlmacen sa on t.SubAlmacenDestino= sa.id_SubAlmacen" +
                " inner join zona z on t.ZonaDestino= z.id_zona where " +
                "t.idTransferencia ='"+codigo+"'");
        }
       List lista=consulta.getResultList();
       if(lista.size()>0){
           tra= (TransferenciaTO)Utiles_Convertir.convertirToBeanBinding_Tranferencia(lista).get(0);
      }
       return tra;

     }

 public List<DetalleTransferenciaTO> getDatosDetalleTransferencia(String codigo) throws Exception {
      
     Query consulta = this.em.createNativeQuery("select iddetalleTransferencia, idTransferencia, d.id_suministro, d.cantidad, " +
                "precio, fecha,  id_zona, id_localidad, ccosto, cta_con, cod_inv, cod_presupuestal," +
                " cod_Uni_Organizativa,  valor,s.descripcion,t.descripcion_valor from " +
                "detalleTransferencia d inner join suministros s on d.id_suministro=s.ID_Suministro " +
                "inner join tipo t on s.tipo_unidad_medida= t.id_tabla_tipo where " +
                "idTransferencia='"+codigo+"'");

        List<DetalleTransferenciaTO> lista2= Utiles_Convertir.convertirTODetalleTransferencia_detalleTransferenciaTO(consulta.getResultList());
        return lista2;
     }
 public List<DetalleTransferenciaTO> getDatosDetalleTransferenciaStock(String codigo) throws Exception {

     Query consulta = this.em.createNativeQuery("select  d.id_suministro,s.descripcion, t.descripcion_valor,d.cantidad,d.stockOrigen," +
             " d.stockDestino from detalleTransferencia d inner join suministros s on d.id_suministro=s.ID_Suministro inner join tipo t " +
             "on s.tipo_unidad_medida= t.id_tabla_tipo  where d.idTransferencia='"+codigo+"'");
        List<DetalleTransferenciaTO> lista2= Utiles_Convertir.convertirTODetalleTransferencia_detalleStock(consulta.getResultList());
        return lista2;
     }
 //
     public List<IngresoTO> getDatosMovimiento(String codigo, int tipo, int accion, String proy, String unid, int tipoIn, String empresa, String anio, int mes, int pagActual,int pagTamanno) throws Exception {
         Query consulta=null;
         if(accion==1){
           consulta=this.em.createNativeQuery("select id_movimiento, isnull(nroOrden,'-'), t.descripcion_valor,  m.serie,m.numero, " +
                 "convert(char(10),m.fecha,103),  a.descripcion, sa.descripcion, " +
                 "z.nom_zona, isnull(cod_pedido,'-'), isnull(idtransferencia,'-'), m.id_empresa from movimiento m inner join almacen a on m.id_almacen= " +
                 "a.id_almacen inner join subAlmacen sa on m.id_subalmacen= sa.id_SubAlmacen  inner join zona z " +
                 "on m.id_zona= z.id_zona inner join tipo t on t.id_tabla_tipo= m.tipo_Ingreso where tipo_movimiento='"+tipo+"' and id_movimiento='"+codigo+"' and tipo_Ingreso='"+tipoIn+"' and m.id_empresa='"+empresa+"'");

          }
         if(accion==6){
           consulta=this.em.createNativeQuery("select distinct m.id_movimiento, isnull(m.nroOrden,'-'), t.descripcion_valor,  m.serie,m.numero," +
                   "convert(char(10),m.fecha,103), a.descripcion, sa.descripcion, z.nom_zona, isnull(m.cod_pedido,'-'), isnull(m.idtransferencia,'-'), m.id_empresa from " +
                   "movimiento m inner join almacen a on m.id_almacen= a.id_almacen inner join subAlmacen sa on m.id_subalmacen= " +
                   "sa.id_SubAlmacen  inner join zona z on m.id_zona= z.id_zona inner join tipo t on t.id_tabla_tipo= m.tipo_Ingreso" +
                   " inner join detallemovimiento p on m.id_movimiento=p.id_movimiento where m.tipo_movimiento='"+tipo+"' and tipo_Ingreso='"+tipoIn+"' and m.id_empresa='"+empresa+"'" +
                   " and m.anio='"+anio+"'  and m.mes='"+mes+"'");
          }
           List<IngresoTO> lista2= Utiles_Convertir.convertirTODetalleIngresoTO(consulta.setFirstResult(pagActual*pagTamanno).setMaxResults(pagTamanno).getResultList());
          return lista2;
     }
 public int getDatosMovimientoTamaño(String codigo, int tipo, int accion, String proy, String unid, int tipoIn, String empresa,String anio, int mes) throws Exception {
         Query consulta=null;
         if(accion==1){
           consulta=this.em.createNativeQuery("select id_movimiento, isnull(nroOrden,'-'), t.descripcion_valor,  m.serie,m.numero, " +
                 "convert(char(10),m.fecha,103),  a.descripcion, sa.descripcion, " +
                 "z.nom_zona, isnull(cod_pedido,'-'), isnull(idtransferencia,'-'), m.id_empresa from movimiento m inner join almacen a on m.id_almacen= " +
                 "a.id_almacen inner join subAlmacen sa on m.id_subalmacen= sa.id_SubAlmacen  inner join zona z " +
                 "on m.id_zona= z.id_zona inner join tipo t on t.id_tabla_tipo= m.tipo_Ingreso where tipo_movimiento='"+tipo+"' and id_movimiento='"+codigo+"' and tipo_Ingreso='"+tipoIn+"' and m.id_empresa='"+empresa+"'");

          }
         if(accion==6){
           consulta=this.em.createNativeQuery("select distinct m.id_movimiento, isnull(m.nroOrden,'-'), t.descripcion_valor,  m.serie,m.numero," +
                   "convert(char(10),m.fecha,103), a.descripcion, sa.descripcion, z.nom_zona, isnull(m.cod_pedido,'-'), isnull(m.idtransferencia,'-'), m.id_empresa from " +
                   "movimiento m inner join almacen a on m.id_almacen= a.id_almacen inner join subAlmacen sa on m.id_subalmacen= " +
                   "sa.id_SubAlmacen  inner join zona z on m.id_zona= z.id_zona inner join tipo t on t.id_tabla_tipo= m.tipo_Ingreso" +
                   " inner join detallemovimiento p on m.id_movimiento=p.id_movimiento where m.tipo_movimiento='"+tipo+"' and tipo_Ingreso='"+tipoIn+"' and m.id_empresa='"+empresa+"'" +
                   " and m.anio='"+anio+"'  and m.mes='"+mes+"'");
          }
          int resultado=consulta.getResultList().size();
          return resultado;
     }
     public List<EmpresaTO> obtenerEmpresas() throws Exception {
     Query consulta = this.em.createNativeQuery("Select id_empresa, desc_direccion, ruc, razon_social, principal  from Empresa");
     List<EmpresaTO> lista2= Utiles_Convertir.convertirToBeanBinding_Empresa(consulta.getResultList());
     return lista2;
     }
     public Boolean registrarStockAlmacen(String usuario, String mac,StockAlmacen stock, int estado) throws Exception{
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        boolean acep= false;
        try {
          stock.setIdEmpresa(this.em.find(Empresa.class, stock.getIdEmpresa().getIdEmpresa()));
          stock.setMac(mac);
          stock.setUsuario(usuario);
          stock.setFechaOperacion(new Date());
          if(estado==1){
              em.persist(stock);
          }
          if(estado==2){
              em.merge(stock);
          }
          this.em.flush();
          tx.commit();
          acep=true;
        } catch (Exception e) {
          tx.rollback();
          throw e;
        }
        return acep;

     }
      public List<AnoTO> getParametrosKardex() throws Exception {

     Query consulta = this.em.createNativeQuery("select distinct ano, mes from kardex");
        List<AnoTO> lista2= Utiles_Convertir.convertirToBeanBinding_ParametrosKardex(consulta.getResultList());
        return lista2;
     }
       public List<DetalleIngresoTO> getDatosBusquedaSensitivaIngreso(String empresa) throws Exception {
         Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("tipo_Movimiento", "I"));
        Query consulta = this.em.createNativeQuery("select distinct dm.id_Movimiento, dm.id_zona  from DetalleMovimiento dm inner " +
                "join movimiento m on dm.id_Movimiento= m.id_Movimiento where estado_ubicacion=0 and m.tipo_movimiento='"+tipo.getIdTablaTipo()+"' and m.tipo_Ingreso<>'149'" +
                " and m.id_empresa='"+empresa+"'");
        List<DetalleIngresoTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_BusquedaIngresoTO(consulta.getResultList());
        return lista2;
     }
       public List<DetalleIngresoTO> getDatosBusquedaSensitivaIngresoInventario(String empresa) throws Exception {
         Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("tipo_Movimiento", "I"));
        Query consulta = this.em.createNativeQuery("select distinct dm.id_Movimiento, dm.id_zona  from DetalleMovimiento dm inner " +
                "join movimiento m on dm.id_Movimiento= m.id_Movimiento where estado_ubicacion=0 and m.tipo_movimiento='"+tipo.getIdTablaTipo()+"' and m.tipo_Ingreso='149'" +
                " and m.id_empresa='"+empresa+"'");
        List<DetalleIngresoTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_BusquedaIngresoTO(consulta.getResultList());
        return lista2;
     }
public String insertarNotaIngresoInventario(String usuario, String mac,Movimiento mov, List<DetalleMovimiento> detalleMovimiento,String inventario) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    mov.setIdAlmacen(this.em.find(Almacen.class, "01"));
    mov.setIdSubalmacen(this.em.find(SubAlmacen.class, "1"));
    mov.setIdZona(this.em.find(Zona.class, "01"));
    String codigo = this.getId(mov);
    tx.begin();
    try {
          mov.setIdMovimiento(codigo);
          mov.setUsuario(usuario);
          mov.setMac(mac);
          mov.setEmpresa(em.find(Empresa.class, mov.getEmpresa().getIdEmpresa()));
          mov.setFechaOperacion(new Date());
          this.em.persist(mov);
          for (DetalleMovimiento detalle : detalleMovimiento)
          {
            DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(),codigo);
            detalle.setDetalleMovimientoPK(detapk);
            detalle.setEstado_ubicacion(new Integer(1));
            Tipo moneda= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_moneda", "01"));
            detalle.setCambio_moneda(BigDecimal.ONE);
            detalle.setTipo_moneda(moneda.getIdTablaTipo());
            detalle.setIdZona(this.em.find(Zona.class, "01"));
            this.em.persist(detalle);
          }
        
       for (DetalleMovimiento detalle : detalleMovimiento)
       {
        DetalleInventarioPK detalleinventariopk= new DetalleInventarioPK(inventario, detalle.getIdSuministro().getIDSuministro(),mov.getEmpresa().getIdEmpresa());
        DetalleInventario detalleinventario=em.find(DetalleInventario.class,detalleinventariopk);
        if(detalleinventario==null){
            detalleinventario= new DetalleInventario(detalleinventariopk);
            detalleinventario.setCantidadActual(detalle.getCantidad());
            detalleinventario.setPrecioPromedio(detalle.getPrecio());
            detalleinventario.setCantidadAjustada(detalle.getCantidad());
            detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
            detalleinventario.setCantidadSobrante(detalle.getCantidad());
            Suministros su= this.em.find(Suministros.class, detalle.getIdSuministro().getIDSuministro());
            detalleinventario.setCtacontable(su.getCodGrupoSumi().getCodGrupoSumi());
            detalleinventario.setDescripcion(su.getDescripcion());
            detalleinventario.setExistenciaFisica(BigDecimal.ZERO);
            detalleinventario.setGrupoSuministro(su.getCodGrupoSumi().getCodGrupoSumi());
            detalleinventario.setIdMovimiento(codigo);
            detalleinventario.setInventario(this.em.find(Inventario.class, inventario));
            detalleinventario.setMontoActual(detalle.getValor());
            detalleinventario.setMontoFaltante(BigDecimal.ZERO);
            detalleinventario.setMontoFisico(BigDecimal.ZERO);
            detalleinventario.setMontoSobrante(detalle.getValor());
            detalleinventario.setUnidad(su.getTipoUnidadMedida().getDescripcionValor());
            detalleinventario.setFechaOperacion(new Date());
            this.em.persist(detalleinventario);


        }
        else{
            detalleinventario.setCantidadAjustada(detalle.getCantidad());
            detalleinventario.setIdMovimiento(codigo);
            detalleinventario.setCantidadActual(detalleinventario.getCantidadActual().add(detalle.getCantidad()));
            detalleinventario.setMontoActual(detalleinventario.getCantidadActual().multiply(detalleinventario.getPrecioPromedio()));
            detalleinventario.setFechaOperacion(new Date());
            BigDecimal diferencia= detalleinventario.getCantidadActual().subtract(detalleinventario.getExistenciaFisica());
            if(diferencia.compareTo(BigDecimal.ZERO)>0){
                detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
                detalleinventario.setMontoFaltante(BigDecimal.ZERO);
                detalleinventario.setCantidadSobrante(diferencia);
                detalleinventario.setMontoSobrante(diferencia.multiply(detalleinventario.getPrecioPromedio()));

            }
            if(diferencia.compareTo(BigDecimal.ZERO)<0){
                detalleinventario.setCantidadSobrante(BigDecimal.ZERO);
                detalleinventario.setMontoSobrante(BigDecimal.ZERO);
                BigDecimal diferencian= diferencia.multiply(new BigDecimal(-1));
                detalleinventario.setCantidadFaltante(diferencian);
                detalleinventario.setMontoFaltante(diferencian.multiply(detalleinventario.getPrecioPromedio()));

            }
            if(diferencia.compareTo(BigDecimal.ZERO)==0){
                detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
                detalleinventario.setMontoFaltante(BigDecimal.ZERO);
                detalleinventario.setCantidadSobrante(BigDecimal.ZERO);
                detalleinventario.setMontoSobrante(BigDecimal.ZERO);
            }
            this.em.merge(detalleinventario);
        }

      }
     this.em.flush();
     tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;
}

   public String insertarSalidaInventario(String usuario, String mac,Movimiento mov,List<DetalleMovimiento> detalleMovimiento,String inventario) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    mov.setIdAlmacen(this.em.find(Almacen.class, "01"));
    mov.setIdSubalmacen(this.em.find(SubAlmacen.class, "1"));
    mov.setIdZona(this.em.find(Zona.class, "01"));
    String codigo = this.getId(mov);
    tx.begin();

    try {
      mov.setUsuario(usuario);
      mov.setMac(mac);
      mov.setEmpresa(em.find(Empresa.class,mov.getEmpresa().getIdEmpresa()));
      mov.setIdMovimiento(codigo);
      mov.setFechaOperacion(new Date());
      
      em.persist(mov);
       for (DetalleMovimiento detalle : detalleMovimiento)
          {
            DetalleMovimientoPK detapk= new DetalleMovimientoPK(detalle.getDetalleMovimientoPK().getNrodetalleMovimiento(),codigo);
            detalle.setDetalleMovimientoPK(detapk);
            Tipo moneda= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_moneda", "01"));
            detalle.setCambio_moneda(BigDecimal.ONE);
             detalle.setIdZona(this.em.find(Zona.class, "01"));
            detalle.setTipo_moneda(moneda.getIdTablaTipo());
            this.em.persist(detalle);
          }

      for (DetalleMovimiento detalle : detalleMovimiento)
       {
        DetalleInventarioPK detalleinventariopk= new DetalleInventarioPK(inventario, detalle.getIdSuministro().getIDSuministro(),mov.getEmpresa().getIdEmpresa());
        DetalleInventario detalleinventario=em.find(DetalleInventario.class,detalleinventariopk);
        if(detalleinventario==null){
            detalleinventario= new DetalleInventario(detalleinventariopk);
            detalleinventario.setCantidadActual(detalle.getCantidad());
            detalleinventario.setPrecioPromedio(detalle.getPrecio());
            detalleinventario.setCantidadAjustada(detalle.getCantidad());
            detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
            detalleinventario.setCantidadSobrante(detalle.getCantidad());
            Suministros su= this.em.find(Suministros.class, detalle.getIdSuministro().getIDSuministro());
            detalleinventario.setCtacontable(su.getCodGrupoSumi().getCodGrupoSumi());
            detalleinventario.setDescripcion(su.getDescripcion());
            detalleinventario.setExistenciaFisica(BigDecimal.ZERO);
            detalleinventario.setGrupoSuministro(su.getCodGrupoSumi().getCodGrupoSumi());;
            detalleinventario.setIdMovimiento(codigo);
            detalleinventario.setInventario(this.em.find(Inventario.class, inventario));
            detalleinventario.setMontoActual(detalle.getValor());
            detalleinventario.setMontoFaltante(BigDecimal.ZERO);
            detalleinventario.setMontoFisico(BigDecimal.ZERO);
            detalleinventario.setMontoSobrante(detalle.getValor());
            detalleinventario.setUnidad(su.getTipoUnidadMedida().getDescripcionValor());
            detalleinventario.setFechaOperacion(new Date());
            this.em.persist(detalleinventario);


        }
        else{
            detalleinventario.setCantidadAjustada(detalle.getCantidad().add(detalleinventario.getCantidadAjustada()));
            detalleinventario.setIdMovimiento(codigo);
            detalleinventario.setCantidadActual(detalleinventario.getCantidadActual().subtract(detalle.getCantidad()));
            detalleinventario.setMontoActual(detalleinventario.getCantidadActual().multiply(detalleinventario.getPrecioPromedio()));
            detalleinventario.setFechaOperacion(new Date());
            BigDecimal diferencia= detalleinventario.getCantidadActual().subtract(detalleinventario.getExistenciaFisica());
            if(diferencia.compareTo(BigDecimal.ZERO)>0){
                detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
                detalleinventario.setMontoFaltante(BigDecimal.ZERO);
                detalleinventario.setCantidadSobrante(diferencia);
                detalleinventario.setMontoSobrante(diferencia.multiply(detalleinventario.getPrecioPromedio()));

            }
            if(diferencia.compareTo(BigDecimal.ZERO)<0){
                detalleinventario.setCantidadSobrante(BigDecimal.ZERO);
                detalleinventario.setMontoSobrante(BigDecimal.ZERO);
                BigDecimal diferencian= diferencia.multiply(new BigDecimal(-1));
                detalleinventario.setCantidadFaltante(diferencian);
                detalleinventario.setMontoFaltante(diferencian.multiply(detalleinventario.getPrecioPromedio()));

            }
            if(diferencia.compareTo(BigDecimal.ZERO)==0){
                detalleinventario.setCantidadFaltante(BigDecimal.ZERO);
                detalleinventario.setMontoFaltante(BigDecimal.ZERO);
                detalleinventario.setCantidadSobrante(BigDecimal.ZERO);
                detalleinventario.setMontoSobrante(BigDecimal.ZERO);
            }
            this.em.merge(detalleinventario);
        }
      }
      this.em.flush();
      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;
}
   public List<TransferenciaTO> obtenerCodigos(int tipoConsulta) throws Exception{
       List<TransferenciaTO> lista2=new ArrayList();
       //orden
      
       if(tipoConsulta==1){
        Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("tipo_Orden", "01"));
        Tipo tipo2 = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "TA"));
        Tipo tipo3 = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_orden", "AN"));
        Query consulta = this.em.createNativeQuery("Select distinct o.nro_orden,o.id_zona, id_empresa from orden o " +
          "  inner join orden_comprobante oc on o.nro_orden=oc.nro_orden where " +
          " estado_atencion <>'"+tipo2.getIdTablaTipo()+"' and estado_atencion <>'"+tipo3.getIdTablaTipo()+"'" +
          "and tipo_orden='"+tipo.getIdTablaTipo()+"'");
         lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());

       }
       //transferncia
       if(tipoConsulta==2){
        Query consulta = this.em.createNativeQuery("select idTransferencia, zonaDestino, id_empresa from transferencia where estado='1'");
         lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());
       }
       //pedido
       if(tipoConsulta==3){
        Tipo tipo = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("id_tipo_estado_pedido", "AC"));
        Tipo tipo2 = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionPedidoDAO.getTipoCampoCodigo("tipo_administradorTarea", "02"));
        Query consulta = this.em.createNativeQuery("select p.cod_pedido, p.id_zona, p.id_empresa from pedido p INNER JOIN  " +
                "DETALLE_PEDIDO_SUMINISTRO dp on p.cod_pedido=dp.cod_pedido  where p.tipo_estado_pedido='"+tipo.getIdTablaTipo()+"'" +
                " and dp.TIPO_ESTADO_PEDIDO='"+tipo.getIdTablaTipo()+"' AND ID_TIPO_ADMINISTRADOR_TAREA='"+tipo2.getIdTablaTipo()+"'" );
       lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());
       }
       //transferencia
       if(tipoConsulta==4){
        Query consulta = this.em.createNativeQuery("select idTransferencia, zonaOrigen, id_empresa from transferencia where estado='0'");
         lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());
       }
       if(tipoConsulta==5){
        Query consulta = this.em.createNativeQuery("select descripcionProceso,codProceso, cod_proveedor from licitacion where alta=1");
         lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());
       }
       if(tipoConsulta==6){
        Query consulta = this.em.createNativeQuery("select descripcionProceso,codProceso, cod_proveedor from licitacion where alta=0");
         lista2= Utiles_Convertir.convertirToObtenerCodigos(consulta.getResultList());
       }
       return lista2;

   }
   //CONSULTAS TOTALES
    public List<DetalleMovimientoTO> listarMovimientosSuministros(ParametrosConsultaTO parametros) throws Exception {

         String sql = "select do.id_movimiento,do.id_suministro,su.descripcion,do.cantidad,do.precio,o.nroOrden,zo.nom_zona,convert(VarChar(10),o.fecha,103), t5.descripcion_valor, do.cambio_moneda "+
                                                    "from detallemovimiento do inner join movimiento o on do.id_movimiento=o.id_movimiento inner join zona zo on o.id_zona=zo.id_zona inner join suministros su on do.id_suministro=su.id_suministro "+
                                                        "  inner join tipo t5 on do.tipo_moneda=t5.id_tabla_tipo  "+getCadenaWhere(parametros) +" " +
                                                        "order by do.id_suministro,o.fecha_operacion asc";
        Query consulta = this.em.createNativeQuery(sql);
        return Utiles_Convertir.convertirToBeanBinding_MovimientoSuministros(consulta.getResultList());
    }

     public List<DetalleMovimientoTO> listarMovimientosProveedores(ParametrosConsultaTO parametros) throws Exception {

         String sql = "select o.id_movimiento, nro_orden,convert(VarChar(10),o.fecha,103),p.cod_proveedor,p.razon_social ,zo.nom_zona "+
                            "from movimiento o inner join orden ord on o.nroOrden=ord.nro_orden " +
                            "inner join proveedor p on ord.cod_proveedor=p.cod_proveedor "+
                                    "inner join zona zo on ord.id_zona=zo.id_zona "+getCadenaWhere(parametros) + " "+
                                    "order by p.razon_social asc";
        Query consulta = this.em.createNativeQuery(sql);
        return Utiles_Convertir.convertirToBeanBinding_MovimientoProveedores(consulta.getResultList());
    }

      public List<DetalleMovimientoTO> listarMovimientosTotales(ParametrosConsultaTO parametros) throws Exception {
       String sql="select do.id_movimiento,do.id_suministro,su.descripcion,do.cantidad,do.precio,isnull(o.nroOrden,'-')," +
               "isnull(o.cod_pedido, '-'), isnull(o.idtransferencia,'-'),zo.nom_zona,convert(VarChar(10),o.fecha,103), t5.descripcion_valor, do.cambio_moneda" +
               "  from detallemovimiento do inner join movimiento o on do.id_movimiento=o.id_movimiento inner join zona " +
               "zo on o.id_zona=zo.id_zona inner join suministros su on do.id_suministro=su.id_suministro " +
               " inner join tipo t5 on do.tipo_moneda=t5.id_tabla_tipo "+ getCadenaWhere(parametros)+" " +
               " order by o.fecha_operacion asc ";

        Query consulta = this.em.createNativeQuery(sql);
        return Utiles_Convertir.convertirToBeanBinding_MovimientoTotales(consulta.getResultList());
    }

      public List<DetalleMovimientoTO> listarMovimientoCuentas(ParametrosConsultaTO parametros) throws Exception {

          String sql = "select do.id_movimiento,do.id_suministro,su.descripcion,do.cantidad,do.precio,o.nroOrden,zo.nom_zona,convert(VarChar(10),o.fecha,103), do.cta_cble_alm, t5.descripcion_valor, do.cambio_moneda "+
          "from detallemovimiento do inner join movimiento o on do.id_movimiento=o.id_movimiento inner join zona zo on o.id_zona=zo.id_zona inner join suministros su on do.id_suministro=su.id_suministro " +
                  " inner join tipo t5 on do.tipo_moneda=t5.id_tabla_tipo"+
          " "+getCadenaWhere(parametros) +" " +
           "order by do.cta_cble_alm,do.id_suministro,o.fecha_operacion asc";
        Query consulta = this.em.createNativeQuery(sql);
        return Utiles_Convertir.convertirToBeanBinding_MovimientoCuentas(consulta.getResultList());
    }


      private String getCadenaWhere(ParametrosConsultaTO parametros){
        String cadena_where = "";
        if(parametros.getRuc_proveedor()!=null)
            cadena_where+="where ord.cod_proveedor = '"+parametros.getRuc_proveedor()+ "' ";

        if(parametros.getId_zona()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where o.id_zona = '"+parametros.getId_zona()+ "' ";
            else
                cadena_where+="and o.id_zona = '"+parametros.getId_zona()+ "' ";
        }
        if(parametros.getAnio()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where o.ano = '"+parametros.getAnio()+ "' ";
            else
                cadena_where+="and o.ano = '"+parametros.getAnio()+ "' ";
        }
        if(parametros.getMes()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where o.mes = '"+parametros.getMes()+ "' ";
            else
                cadena_where+="and o.mes = '"+parametros.getMes()+ "' ";
        }
        if(parametros.getId_empresa()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where o.id_empresa = '"+parametros.getId_empresa()+ "' ";
            else
                cadena_where+="and o.id_empresa = '"+parametros.getId_empresa()+ "' ";
        }
        if(parametros.getTipo_orden()!=0){
            if(cadena_where.length()==0)
                cadena_where+="where o.tipo_movimiento = "+parametros.getTipo_orden();
            else
                cadena_where+="and o.tipo_movimiento = "+parametros.getTipo_orden();
        }
         if(parametros.getFecha_inicio()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where CONVERT(VARCHAR,o.fecha,103)  >= '"+parametros.getFecha_inicio()+ "' ";
            else
                cadena_where+="and  CONVERT(VARCHAR,o.fecha,103)  >= '"+parametros.getFecha_inicio()+ "' ";
        }
        if(parametros.getFecha_fin()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where CONVERT(VARCHAR,o.fecha,103)  <= '"+parametros.getFecha_fin()+ "' ";
            else
                cadena_where+="and CONVERT(VARCHAR,o.fecha,103)  <= '"+parametros.getFecha_fin()+ "' ";
        }
         if(parametros.getId_suministro()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where do.id_suministro = '"+parametros.getId_suministro()+ "' ";
            else
                 cadena_where+="and do.id_suministro = '"+parametros.getId_suministro()+ "' ";
        }
        if(parametros.getCuenta()!=null){
            if(cadena_where.length()==0)
                cadena_where+="where do.cta_cble_alm = '"+parametros.getCuenta()+ "' ";
            else
               cadena_where+="and do.cta_cble_alm = '"+parametros.getCuenta()+ "' ";
        }

        return cadena_where;
   }
     public String eliminarMovimiento(String movimiento) throws Exception
     {
   String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      Movimiento mov= this.em.find(Movimiento.class, movimiento);
      CallableStatement csLlamada = cnx.prepareCall("{call [dbo].[sp_sumi_eliminarMovimiento](?,?,?)}");
      csLlamada.setString(1, mov.getIdMovimiento());
      csLlamada.setString(2, mov.getEmpresa().getIdEmpresa());
      csLlamada.registerOutParameter(3, 12);
      csLlamada.execute();
      retorno = csLlamada.getString(3);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
    }
 public MovimientoTO getMovimientoModificar(String codigo) throws Exception{
     String sql="select m.id_movimiento, convert(char(10), m.fecha, 103),p.razon_social," +
             " isnull(m.ruc,''),  isnull(p2.razon_social,''), isnull(m.cosechador,'')," +
             " t.descripcion_valor,m.tipo_movimiento from movimiento m left join proveedor p" +
             " on m.ruc=p.cod_proveedor inner join tipo t on m.tipo_movimiento=t.id_tabla_tipo " +
             " left join proveedor p2 on m.cosechador=p2.cod_proveedor where m.id_movimiento='"+codigo+"'";
     Query consulta = this.em.createNativeQuery(sql);
     return Utiles_Convertir.convertirToBeanBinding_MovimientoAdministrar(consulta.getResultList()).get(0);

 }
public  java.util.List<suministros.ejb30.TO.DetalleMovimientoTO> getDetallesMovimientoModificar(String codigo) throws Exception{
     String sql="select distinct d.id_suministro, s.descripcion, d.cantidad, d.precio," +
             " isnull( d.precioCosechador,'0.00'), nro_detalleMovimiento from detallemovimiento d inner join suministros s" +
             " on d.id_suministro=s.id_suministro where d.id_movimiento='"+codigo+"'";
     Query consulta = this.em.createNativeQuery(sql);
     return Utiles_Convertir.convertirToBeanBinding_MovimientoAdministrarDetalle(consulta.getResultList());

 }
public  java.util.List<suministros.ejb30.TO.DetalleMovimientoTO> getDetallesMovimientoAjustar( String anio, String mes) throws Exception{
     String sql=" select distinct id_suministro, id_movimiento, nrodetalleMovimiento from kardex  where ano='"+anio+"' and mes='"+mes+"'";
     Query consulta = this.em.createNativeQuery(sql);
     return Utiles_Convertir.convertirToBeanBinding_MovimientoAjustarDetalle(consulta.getResultList());

 }
public  java.util.List<suministros.ejb30.TO.TipoTO> getConsultarTipoCambioComprobante(Integer comprobante) throws Exception{
     String sql=" select 1, convert(char(10),fecha_ingreso,103) from comprobantepago where id_comprobante='"+comprobante+"'";
     Query consulta = this.em.createNativeQuery(sql);
     return Utiles_Convertir.convertirToBeanBinding_Tipo(consulta.getResultList());

 }
 public List<ComprobantePagoTO> getDatosOrdenComprobante(String codigo) throws Exception {
        List<ComprobantePagoTO> or= new ArrayList<ComprobantePagoTO>();       
        Query consulta = this.em.createNativeQuery("select cp.id_comprobante,cp.serie_comprobante, cp.numero_comprobante, cp.monto-cp.monto_ingresado ," +
                "doi.porcentaje_impuesto from  COMPROBANTEPAGO cp inner join orden_comprobante o on cp.id_comprobante=o.id_comprobante " +
                "inner join detalleordenimpuesto doi on doi.nro_orden= o.nro_orden where o.nro_orden='"+codigo+"' and  cp.monto>cp.monto_ingresado");

        List lista=consulta.getResultList();
        if(lista.size()>0){
            or= Utiles_Convertir.convertirTOComprobantePagoOrdenTO(lista);
        }
        else{
            or=null;
        }
        return or;

     }//

   
}


